package com.chenxys.algorithm.newbie;

/**
 * <p>
 *      给定一个随机函数，生成对应的随机函数
 *      给定一个[0,6)的随机函数，生成一个[1,7]等概率的函数
 * </p>
 *
 * @author Chenxys
 * @version V1.0
 * @Package com.chenxys.algorithm.newbie
 * @date 12/24/23 9:14 PM
 * @Copyright ©
 */
public class RandToRand {
    /**
     * <p>
     *     lib包中的函数，不可修改
     * </p>
     * @return [1,6)
     */
    public static int libF1(){
        return (int)(Math.random() * 5) + 1;
    }

    /**
     * <p>
     *     自己改造函数，等概率的返回0和1
     * </p>
     * @return 等概率的返回0和1
     */
    public static int useF2(){
        int ans = 0;
        do {
            ans = libF1();
        }while (ans == 3);
        return ans < 3 ? 0 : 1;
    }

    /**
     * <p>
     *     得到000 ～ 111 做到等概率
     * </p>
     * @return 得到0 ～ 7等概率
     */
    public static int useF3(){
        return (useF2() << 2) + (useF2() << 1) + (useF2() << 0);
    }

    /**
     * <p>
     *     0 ~ 6 等概率返回一个
     * </p>
     * @return 0 ~ 6 等概率返回一个
     */
    public static int useF4(){
        int ans = 0;
        // 不要7，当为7时重新生成
        do {
            ans = useF3();
        } while (ans == 7);
        return ans;
    }

    /**
     * <p>
     *     1 ~ 7 等概率返回一个
     * </p>
     * @return 1 ~ 7 等概率返回一个
     */
    public static int useF5(){
        return useF4() + 1;
    }

    public static void main(String[] args) {
        int count = 0;
        int testTimes = 10000;
        for (int i = 0; i < testTimes; i++) {
            if (useF2() == 0) count++;
        }
        System.out.println((double) count / (double) testTimes);
        System.out.println("============");

        int[] counts = new int[8];
//        for (int i = 0; i < testTimes; i++) {
//            int num = useF3();
//            counts[num]++;
//        }
//
//        for (int i = 0; i < 8; i++) {
//            System.out.println(i + "这个数,出现了 "+ counts[i] + " 次");
//        }
//        System.out.println("============");
//        for (int i = 0; i < testTimes; i++) {
//            int num = useF4();
//            counts[num]++;
//        }
//
//        for (int i = 0; i < 8; i++) {
//            System.out.println(i + "这个数,出现了 "+ counts[i] + " 次");
//        }

        System.out.println("============");
        for (int i = 0; i < testTimes; i++) {
            int num = useF5();
            counts[num]++;
        }

        for (int i = 0; i < 8; i++) {
            System.out.println(i + "这个数,出现了 "+ counts[i] + " 次");
        }
    }
}
